package com.jg.utils.Thread;

import java.util.concurrent.TimeUnit;

/**
 *
 * 上面的程序(Jion.java)就是join方法的一个案例，可以看到，我们在t1线程启动后，又调用了t1的 join 方法，那
 * 么这样的话main线程会等待t1线程执行完毕后，才会继续启动t2和t3线程。可以看到，我们在调用
 * join 方法的时候，会抛出一个 InterruptedException ， 说明join方法也是可中断的。
 * 到这里又有一个问题，如果这个需求工程师不太靠谱，整理需求的时间非常之久，以至于可能会导致项
 * 目延期，开发者难道需要一直等着吗？显然不是的，如果需求工程师操作比较慢的话，开发者也可以先
 * 把与主体业务无关的功能开发掉，比如RBAC模块等，那么这里我们的join方法就不能一直等着了，应该
 * 给定一个等待时长，如果需求不能在要求的时间内下来的话，开发者就先不等了。
 */

public class JionThread1 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Product1());
        Thread t2 = new Thread(new Front1());
        Thread t3 = new Thread(new Back1());
        t1.start();
        t1.join(5000);
        t2.start();
        t3.start();
    }
}
class Product1 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("产品整理需求中....");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class Front1 implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("前端程序员正在写页面...");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
class Back1 implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("后端程序员正在写接口...");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
